#ifndef ECOCICTY_PRODUCT_H
#define ECOCICTY_PRODUCT_H

#include <QString>
#include <vector>
#include "ProductsListener.h"
#include "Customer.h"
#include "Proveider.h"

#define DEFAULT_STRING_VALUE "none"

namespace ecocity
{

class Product
{
public:

    enum PRICE_TYPE
    {
        PER_UNIT           = 0,
        PER_KILO           = 1
    };

    Product( int id,
             const QString& name,
             const QString& description,
             const Proveider& proveider,
             float raw_price = 0,
             PRICE_TYPE price_type = PER_UNIT,
             uint tax_rate = 0,
             uint profit_rate = 0 );

    // reset all except id
    // Suposes id is the same
    bool reset( const Product& product );

    int id( ) const;

    const QString& name( ) const;

    const QString& description( ) const;

    const Proveider& proveider( ) const;

    // Precio/Kilo o Precio/Unidad
    PRICE_TYPE price_type( ) const;

    // Precio sin beneficio y sin IVA
    // Coste a ecocity sin IVA
    float raw_price( ) const;

    // Incluye profit, pero sin IVA
    float untaxed_price( Customer::TYPE customer_type ) const;

    // Precio final: Incluye profit y IVA
    float taxed_price( Customer::TYPE customer_type ) const;

    // IVA a anyadir
    // Depende del tipo de customer, ya que el precio sin IVA cambia
    float taxes( Customer::TYPE customer_type ) const;

    // Porcentaje de IVA a anyadir
    // El mismo para todos los customers
    uint tax_rate( ) const;

    // Porcentaje de beneficio sobre el raw price
    // El mismo para todos los customers
    uint profit_rate( ) const;

    static QString to_string( PRICE_TYPE price_type );
    static PRICE_TYPE to_price_type( const QString& );

private:

    void update_costs( );

private:

    int m_id;

    QString m_name;

    QString m_description;

    Proveider m_provider;

    // Porcentaje de IVA a anyadir
    uint m_tax_rate;

    uint m_profit_rate;

    // Coste a ecocity sin IVA
    float m_raw_price;

    // Precio/Kilo o Precio/Unidad
    PRICE_TYPE m_price_type;

    // Coste a coope sin IVA
    float m_price_coope;

    // Coste a tienda sin IVA
    float m_price_shop;

    // Coste a consumidor final sin IVA
    float m_price_end_customer;
};

}      // namespace ecocity

#endif // ECOCICTY_PRODUCT_H
